package top.ochiamalu.aioj.service;

import com.baomidou.mybatisplus.extension.service.IService;
import top.ochiamalu.aioj.domain.dto.user.UpdateUserDetailDTO;
import top.ochiamalu.aioj.domain.dto.user.UserLoginDTO;
import top.ochiamalu.aioj.domain.dto.user.UserRegistrationDTO;
import top.ochiamalu.aioj.domain.entity.User;
import top.ochiamalu.aioj.domain.vo.profile.UserSecureInfoVO;
import top.ochiamalu.aioj.domain.vo.user.UpdateUserDetailVO;
import top.ochiamalu.aioj.domain.vo.user.UserInfoVO;
import top.ochiamalu.aioj.domain.vo.user.UserLoginVO;

/**
 * 用户服务
 *
 * @author OchiaMalu
 * @date 2025/01/24
 */
public interface UserService extends IService<User> {

    /**
     * 登录
     *
     * @param userLoginDTO 用户登录dto
     * @return {@link UserLoginVO }
     */
    UserLoginVO login(UserLoginDTO userLoginDTO);

    /**
     * 注册
     *
     * @param userRegistrationDTO 用户注册数据
     * @return {@link UserLoginVO }
     */
    UserLoginVO register(UserRegistrationDTO userRegistrationDTO);

    /**
     * 更新用户详细信息
     *
     * @param updateUserDetailDTO 更新用户详细信息dto
     * @return boolean
     */
    boolean updateUserDetail(UpdateUserDetailDTO updateUserDetailDTO);

    /**
     * 获取用户详细信息
     *
     * @return {@link UpdateUserDetailVO }
     */
    UpdateUserDetailVO getUserDetail();

    /**
     * 获取用户信息
     *
     * @param account 账户
     * @return {@link UserInfoVO }
     */
    UserInfoVO getUserInfo(String account);

    /**
     * 通过帐户获取用户ID
     *
     * @param account 账户
     * @return {@link Long }
     */
    Long getUserIdByAccount(String account);

    /**
     * 获取用户安全信息
     *
     * @return {@link UserSecureInfoVO }
     */
    UserSecureInfoVO getUserSecureInfo();

    /**
     * 添加电子邮件
     *
     * @param email 电子邮件
     * @return boolean
     */
    boolean addEmail(String email);

    /**
     * 修改手机
     *
     * @param type  类型
     * @param phone 电话
     * @param code  代码
     * @return boolean
     */
    boolean modifyPhone(Integer type, String phone, String code);

    /**
     * 更新密码
     *
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return boolean
     */
    boolean updatePassword(String oldPassword, String newPassword);
}
